/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package td3.Modele;

/** La classe JeuDeMorpion possède un plateau, 2 joueurs
 * 
 * @author fredericdasilva
 */
public class JeuDeMorpion extends Jeu {
    
    private volatile Thread tache = null;
    boolean premierDsLeCoin = false;
    
    /** Le constructeur de JeuDeMorpion construit et initialise le Plateau de Morpion
     *
     * @param a Le premier JoueurDeMorpion
     * @param b Le second JoueurDeMorpion
     */
    public JeuDeMorpion(Joueur a, Joueur b){
        
        
        super(a,b);
        P=new PlateauMorpion();
        P.initialiser();
        
    }
    
    @Override
    public boolean partieTerminee(){
        
        return(P.nbCoups==P.largeur*P.longueur || AGagne());
    }
    
    @Override
    public Joueur joueurSuivant() {
        if (P.joueurencours==J1.getId()){
            return J2;
        }
        else {
            return J1;
        }
    }
    
    
    @Override
    public Joueur quelleJoueur(int id){
        if (id==J1.getId()){
            return J1;
        }
        else return J2;
    }
   
    @Override
    public String nomJoueurSuivant() {
        return joueurSuivant().getName();
    }
    
    @Override
    public boolean coupPossible(Coup coup){
        if (coup.x>=P.largeur || coup.y>=P.longueur) return false;
        else
            
            return (P.etatIdPlateau[coup.x][coup.y]==0);
    }
    @Override
    public void jouerCoupJeuJoueurHumain(Coup c, int idJeu){
        P.appliquerCoup(c, idJeu);
        setChanged();
        notifyObservers(c);
    }
    
    @Override
    public void jouerCoupJeu(Coup c, int idJeu){
        P.appliquerCoup(c, idJeu);
        setChanged();
        notifyObservers(c);
        //f.tab[c.x][c.y].mettreCouleur(c.x, c.y);
        try {
            Thread.sleep(2000);
            
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt(); // Très important de réinterrompre
            
            //                   Logger.getLogger(JeuDeMorpion.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    @Override
    public void/*Joueur*/ jouerPartie(){
        
        Joueur retour;
        while (!this.partieTerminee()&&!this.AGagne()){
            retour =  this.joueurSuivant();
            if (retour instanceof JoueurHumain){
                //                if (this.hasChanged()){
                //                    break;
                //                }
            }
            else { if (retour.hardCPU==true)
                {
                
                //                Coup c= retour.getCoup(this.P);
                Coup c = jouerCPU(retour);
                if (this.coupPossible(c)){
                    //                P.appliquerCoup(c, retour.getId());
                    
                    
                    this.jouerCoupJeu(c, retour.getId());
                    
                    //                jouerCoupJeuJoueurHumain(c, retour.getId());
                    System.out.println(this.P.toString());
                    System.out.println(this.P.nbCoups+" Coups joués");
                    
                }
                else {
                    //                c= retour.getCoup(this.P);
                    c = jouerCPU(retour);
                    while (!this.coupPossible(c)){
                        //                    c= retour.getCoup(this.P);
                        c = jouerCPU(retour);
                    }
                    this.jouerCoupJeu(c, retour.getId());
                    //                jouerCoupJeuJoueurHumain(c, retour.getId());
                    System.out.println(this.P.toString());
                    System.out.println(this.P.nbCoups+" Coups joués");
                }
            } 
            else {
                
                                Coup c= retour.getCoup(this.P);
//                Coup c = jouerCPU(retour);
                if (this.coupPossible(c)){
                    //                P.appliquerCoup(c, retour.getId());
                    
                    
                    this.jouerCoupJeu(c, retour.getId());
                    
                    //                jouerCoupJeuJoueurHumain(c, retour.getId());
                    System.out.println(this.P.toString());
                    System.out.println(this.P.nbCoups+" Coups joués");
                    
                }
                else {
                                    c= retour.getCoup(this.P);
//                    c = jouerCPU(retour);
                    while (!this.coupPossible(c)){
                                            c= retour.getCoup(this.P);
//                        c = jouerCPU(retour);
                    }
                    this.jouerCoupJeu(c, retour.getId());
                    //                jouerCoupJeuJoueurHumain(c, retour.getId());
                    System.out.println(this.P.toString());
                    System.out.println(this.P.nbCoups+" Coups joués");
                }
            } 
            }
            
            
            
            
        }
        this.quiAGagne();
        
    }
    
    @Override
    public boolean AGagne() {
        boolean b=false;
        
        if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[0][1]&&P.etatIdPlateau[0][1]==P.etatIdPlateau[0][2]){
            P.gagnantId=P.etatIdPlateau[0][0];
            b=true;
            return b;
            
        }
        else if (P.etatIdPlateau[1][0]!=0&&P.etatIdPlateau[1][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[1][2]){
            P.gagnantId=P.etatIdPlateau[1][0];
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[2][1]&&P.etatIdPlateau[2][1]==P.etatIdPlateau[2][2]){
            P.gagnantId=P.etatIdPlateau[2][0];
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][2]){
            P.gagnantId=P.etatIdPlateau[0][0];
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[0][2]){
            P.gagnantId=P.etatIdPlateau[2][0];
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][0]&&P.etatIdPlateau[1][0]==P.etatIdPlateau[2][0]){
            P.gagnantId=P.etatIdPlateau[0][0];
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][1]!=0&&P.etatIdPlateau[0][1]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][1]){
            P.gagnantId=P.etatIdPlateau[0][1];
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][2]!=0&&P.etatIdPlateau[0][2]==P.etatIdPlateau[1][2]&&P.etatIdPlateau[1][2]==P.etatIdPlateau[2][2]){
            P.gagnantId=P.etatIdPlateau[0][2];
            b=true;
            return b;
        }
        else { b=false; return b;
        }
    }
    //}
    @Override
    public void quiAGagne() {
        if (AGagne()){
            if (P.gagnantId==0) {
                
                
                
            }
            else {
                System.out.println("Le joueur "+quelleJoueur(P.gagnantId).getName()+" Id "+P.gagnantId+" a gagné");
                
            }
            
        }
        else {
            System.out.println("------------   MATCH NUL -----------------");
        }
    }
    
    @Override
    public String quiStringAGagne() {
        
        if (AGagne()){
            
            return " "+quelleJoueur(P.gagnantId).getName()+" Id "+P.gagnantId+" a gagné";
            
            
            
        }
        else {
            return "-----   MATCH NUL ----";
        }
    }
    
    
    @Override
    public void run(){
        
        
        tache = Thread.currentThread();
        if (! tache.isInterrupted())
        {
            try
            {
                
                // Tâche
                this.jouerPartie();
                
                Thread.sleep (2000);
                
            }
            catch (InterruptedException exception){
                tache.interrupt(); // Très important de réinterrompre
            }
        }
    }
    
    @Override
    public void arreter()
    {
        //        tache = Thread.currentThread();
        tache.interrupt();
    }
    
    @Override
    public void mise_en_attente()
    {
        //        tache = Thread.currentThread();
        tache.suspend();
    }
    
    @Override
    public void reprise()
    {
        //        tache = Thread.currentThread();
        tache.resume();
    }
    
    /** Permet de faire jouer le CPU, en utilisant les méthodes finirCPU et empecherJFinir
     *
     * @param bg Un joueur aléatoire
     * @return un coup à jouer par le CPU
     */
    public Coup jouerCPU(Joueur bg) {
        boolean joue = false;
        
        Coup p = new CoupMorpion(0,0);
        
        int l,c;
        l=0;
        c=0;
        p = finirCPU(bg);//si le cpu peut finir
        if (this.coupPossible(p)){
            return p;
        }
        if (!this.coupPossible(p)){
            p=empecherJFinir(bg);
            if (this.coupPossible(p)){
                return p;
            }
            else {
                
                switch(P.nbCoups) {
                    //-------------------------------------------------
                    case 0:
                        int k = ((int)(Math.random()*10))%2;
                        if (k == 0) {
                            l=1; c=1;
                        }
                        else {
                            l = 2*((int)(Math.random()*10))%2;
                            c = 2*((int)(Math.random()*10))%2;
                            
                            
                        }
                        joue = true;
                        return new CoupMorpion(l,c);
                        //--------------------------------------------------
                    case 1:
                        if(P.etatIdPlateau[0][0]!= bg.getId() ||P.etatIdPlateau[0][2]!= bg.getId() || P.etatIdPlateau[2][0]!= bg.getId() ||P.etatIdPlateau[2][2]!= bg.getId()) {
                            premierDsLeCoin = true;
                        }
                        if (P.etatIdPlateau[1][1] != 0) {
                            l = 2*((int)(Math.random()*10))%2;
                            c = 2*((int)(Math.random()*10))%2;
                            
                        }
                        else {
                            if (P.etatIdPlateau[0][0] != 0) {l=2; c=2;}
                            else if (P.etatIdPlateau[2][2] != 0) {l=0; c=0;}
                            else if (P.etatIdPlateau[0][1] != 0) {l=2; c=1;}
                            else if (P.etatIdPlateau[0][2] != 0) {l=2; c=0;}
                            else if (P.etatIdPlateau[1][0] != 0) {l=1; c=2;}
                            else if (P.etatIdPlateau[2][0] != 0) {l=0; c=2;}
                            else if (P.etatIdPlateau[1][2] != 0) {l=1; c=0;}
                            else if (P.etatIdPlateau[2][1] != 0) {l=0; c=1;}
                        }
                        joue = true;
                        return new CoupMorpion(l,c);
                        //-------------------------------------------------------------
                    case 2 :
                        if(P.etatIdPlateau[1][1] == bg.getId()) {
                            if (P.etatIdPlateau [0][0] != bg.getId()) {l=2; c=2;}
                            else if (P.etatIdPlateau [2][2] != bg.getId()) {l=0; c=0;}
                            else if (P.etatIdPlateau [0][2] != bg.getId()) {l=2; c=0;}
                            else if (P.etatIdPlateau [2][0] != bg.getId()) {l=0; c=2;}
                            else if (P.etatIdPlateau [0][1] != 0 || P.etatIdPlateau [2][1] != 0 || P.etatIdPlateau [1][2] != 0 || P.etatIdPlateau [1][0] != 0) {
                                l = 2*((int)(Math.random()*10))%2;
                                c = 2*((int)(Math.random()*10))%2;
                                
                            }
                            else {
                                while (!joue) {
                                    l = ((int)(Math.random()*10))%3;
                                    c = ((int)(Math.random()*10))%3;
                                    if (P.etatIdPlateau[l][c] ==0) {
                                        joue = true;
                                        return new CoupMorpion(l,c);
                                    }
                                }
                            }
                        }
                        else if (P.etatIdPlateau[1][1]==0&& (P.etatIdPlateau[0][0] !=0 && P.etatIdPlateau[2][2] !=0 || P.etatIdPlateau[0][2] !=0 && P.etatIdPlateau[2][0] !=0)) {
                            l=1; c=1;
                            joue = true;
                        }
                        else {
                            while (!joue) {
                                l = ((int)(Math.random()*10))%3;
                                c = ((int)(Math.random()*10))%3;
                                if (P.etatIdPlateau[l][c] ==0) {
                                    joue = true;
                                    return new CoupMorpion(l,c);
                                    
                                }
                            }
                        }
                        joue = true;
                        return new CoupMorpion(l,c);
                        //----------------------------------------------
                    case 3 :
                        k =((int)(Math.random()*10))%2;
                        if (P.etatIdPlateau[1][1]==0 && premierDsLeCoin) {
                            l=1; c=1;
                            joue = true;
                        }
                        
                        else if (P.etatIdPlateau[1][1]!= bg.getId() &&(P.etatIdPlateau[0][0] != 0 && P.etatIdPlateau[2][2] != 0 || P.etatIdPlateau[0][2] != 0 && P.etatIdPlateau[2][0] != 0)) {
                            while (!joue) {
                                l = 2*(((int)(Math.random()*10))%2);
                                c = 2*(((int)(Math.random()*10))%2);
                                if (P.etatIdPlateau[l][c] ==0) {
                                    joue = true;
                                    return new CoupMorpion(l,c);
                                }
                            }
                        }
                        else if (P.etatIdPlateau[1][1]!= bg.getId() && (P.etatIdPlateau[0][0]!= bg.getId() ||P.etatIdPlateau[0][2]!= bg.getId() ||P.etatIdPlateau[2][0]!= bg.getId() ||P.etatIdPlateau[2][2]!= bg.getId())) {
                            
                            while (!joue) {
                                l = 2*(((int)(Math.random()*10))%2);
                                c = 2*(((int)(Math.random()*10))%2);
                                if (P.etatIdPlateau[l][c] ==0) {
                                    joue = true;
                                    return new CoupMorpion(l,c);
                                }
                            }
                            
                        }
                        else if (P.etatIdPlateau[1][1] != 0 && (P.etatIdPlateau[0][1] != 0 && P.etatIdPlateau[2][1] != 0 || P.etatIdPlateau[1][0] != 0 && P.etatIdPlateau[1][2] != 0)) {
                            while (!joue) {
                                l = 2*(((int)(Math.random()*10))%2);
                                c = 2*(((int)(Math.random()*10))%2);
                                if (P.etatIdPlateau[l][c] ==0) {
                                    joue = true;
                                    return new CoupMorpion(l,c);
                                }
                            }
                        }
                        
                        
                        else if (P.etatIdPlateau[1][1]==0 && P.etatIdPlateau[1][0]!= bg.getId() && P.etatIdPlateau[0][1]!= bg.getId() && P.etatIdPlateau[0][0]==0) {
                            l=0; c=0;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[1][1]==0 && P.etatIdPlateau[0][1]!= bg.getId() && P.etatIdPlateau[1][2]!= bg.getId() && P.etatIdPlateau[0][2]==0) {
                            l=0; c=2;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[1][1]==0 && P.etatIdPlateau[1][2]!= bg.getId() && P.etatIdPlateau[2][1]!= bg.getId() && P.etatIdPlateau[2][2]==0) {
                            l=2; c=2;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[1][1]==0 && P.etatIdPlateau[2][1]!= bg.getId() && P.etatIdPlateau[1][0]!= bg.getId() && P.etatIdPlateau[2][0]==0) {
                            l=2; c=0;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[0][1]!= bg.getId() && P.etatIdPlateau[2][0]!= bg.getId()) {
                            l=0; c=0;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[0][1]!= bg.getId() && P.etatIdPlateau[2][2]!= bg.getId()) {
                            l=2; c=0;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[2][1]!= bg.getId() && P.etatIdPlateau[0][2]!= bg.getId()) {
                            l=2; c=2;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[2][1]!= bg.getId() && P.etatIdPlateau[0][0]!= bg.getId()) {
                            l=2; c=0;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[1][0]!= bg.getId() && P.etatIdPlateau[2][2]!= bg.getId()) {
                            l=2; c=0;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[1][0]!= bg.getId() && P.etatIdPlateau[0][2]!= bg.getId()) {
                            l=0; c=0;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[1][2]!= bg.getId() && P.etatIdPlateau[0][0]!= bg.getId()) {
                            l=0; c=2;
                            joue = true;
                        }
                        else if (P.etatIdPlateau[1][2]!= bg.getId() && P.etatIdPlateau[2][0]!= bg.getId()) {
                            l=2; c=2;
                            joue = true;
                        }
                        
                        else {
                            while (!joue) {
                                l = ((int)(Math.random()*10))%3;
                                c = ((int)(Math.random()*10))%3;
                                if (P.etatIdPlateau[l][c] ==0) {
                                    joue = true;
                                    return new CoupMorpion(l,c);
                                }
                            }
                        }
                        joue = true;
                        return new CoupMorpion(l,c);
                        //---------------------------------------
                    case 4:
                        if (P.etatIdPlateau[1][1] == bg.getId()) {
                            if (P.etatIdPlateau[0][0] == bg.getId()) {
                                if (P.etatIdPlateau[0][1]==0) {
                                    l=0; c=1;
                                    joue = true;
                                }
                                else if (P.etatIdPlateau[1][0]==0) {
                                    l=1; c=0;
                                    joue = true;
                                }
                            }
                            else if (P.etatIdPlateau[2][2] == bg.getId()) {
                                if (P.etatIdPlateau[2][1]==0) {
                                    l=2; c=1;
                                    joue = true;
                                }
                                else if (P.etatIdPlateau[1][2]==0) {
                                    l=1; c=2;
                                    joue = true;
                                }
                            }
                            
                            else if (P.etatIdPlateau[0][2] == bg.getId()) {
                                if (P.etatIdPlateau[1][2]==0) {
                                    l=1; c=2;
                                    joue = true;
                                }
                                else if (P.etatIdPlateau[0][1]==0) {
                                    l=0; c=1;
                                    joue = true;
                                }
                            }
                            
                            else if (P.etatIdPlateau[2][0] == bg.getId()) {
                                if (P.etatIdPlateau[1][0]==0) {
                                    l=1; c=0;
                                    joue = true;
                                }
                                else if (P.etatIdPlateau[2][1]==0) {
                                    l=2; c=1;
                                    joue = true;
                                }
                            }
                            
                        }
                        return new CoupMorpion(l,c);
                        //-----------------------------------------------
                    case 5:
                        if(!joue && P.etatIdPlateau[1][1]==0) {
                            l=1; c=1;
                            joue = true;
                        }
                        
                        else if (P.etatIdPlateau[0][0]==0) {
                            l=0; c=0;
                            joue = true;
                        }
                        else if (!joue && P.etatIdPlateau[0][2]==0)	 {
                            l=0; c=2;
                            joue = true;
                        }
                        else if (!joue && P.etatIdPlateau[2][0]==0)	 {
                            l=2; c=0;
                            joue = true;
                        }
                        else if (!joue && P.etatIdPlateau[2][2]==0)	 {
                            l=2; c=2;
                            joue = true;
                        }
                        
                        else if(!joue) {
                            while (!joue) {
                                l = ((int)(Math.random()*10))%3;
                                c = ((int)(Math.random()*10))%3;
                                if	 (P.etatIdPlateau[l][c] ==0) {
                                    joue = true;
                                    return new CoupMorpion(l,c);
                                }
                            }
                            
                        }
                        return new CoupMorpion(l,c);
                }
            }
            
            if (!joue) {
                while (!joue) {
                    l = ((int)(Math.random()*10))%3;
                    c = ((int)(Math.random()*10))%3;
                    if (P.etatIdPlateau[l][c] ==0) {
                        joue = true;
                        return new CoupMorpion(l,c);
                    }
                }
            }
            return new CoupMorpion(l,c);
            
        }
        
        return bg.getCoup(P);
       
    }
    
    
    /** Permet de faire gagner le CPU si il a déja aligné deux symboles
     *
     * @param bg  Un joueur aléatoire
     * @return Le coup à faire jouer par le CPU
     */
    public Coup finirCPU(Joueur bg) {
        
        boolean joue = false;
        
        if (( (P.etatIdPlateau[0][1]==bg.getId() && P.etatIdPlateau[0][2]==bg.getId()) ||
                (P.etatIdPlateau[1][0]==bg.getId() && P.etatIdPlateau[2][0]==bg.getId()) ||
                (P.etatIdPlateau[1][1]==bg.getId() && P.etatIdPlateau[2][2]==bg.getId()) ) && P.etatIdPlateau[0][0]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(0,0);
        }
        if (( (P.etatIdPlateau[0][0]==bg.getId() && P.etatIdPlateau[0][2]==bg.getId()) ||
                (P.etatIdPlateau[1][1]==bg.getId() && P.etatIdPlateau[2][1]==bg.getId())) && P.etatIdPlateau[0][1]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(0,1);
        }
        if (( (P.etatIdPlateau[0][0]==bg.getId() && P.etatIdPlateau[0][1]==bg.getId()) ||
                (P.etatIdPlateau[2][0]==bg.getId() && P.etatIdPlateau[1][1]==bg.getId()) ||
                (P.etatIdPlateau[2][2]==bg.getId() && P.etatIdPlateau[1][2]==bg.getId()) ) && P.etatIdPlateau[0][2]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(0,2);
        }
        if (( (P.etatIdPlateau[0][0]==bg.getId() && P.etatIdPlateau[2][0]==bg.getId()) ||
                (P.etatIdPlateau[1][1]==bg.getId() && P.etatIdPlateau[1][2]==bg.getId()) ) && P.etatIdPlateau[1][0]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(1,0);
        }
        if (( (P.etatIdPlateau[0][0]==bg.getId() && P.etatIdPlateau[2][2]==bg.getId()) ||
                (P.etatIdPlateau[0][1]==bg.getId() && P.etatIdPlateau[2][1]==bg.getId()) ||
                (P.etatIdPlateau[1][0]==bg.getId() && P.etatIdPlateau[1][2]==bg.getId()) ||
                (P.etatIdPlateau[0][2]==bg.getId() && P.etatIdPlateau[2][0]==bg.getId()) ) && P.etatIdPlateau[1][1]== 0 && !joue) {
            joue = true;
            return  new CoupMorpion(1,1);
        }
        if (( (P.etatIdPlateau[0][2]==bg.getId() && P.etatIdPlateau[2][2]==bg.getId()) ||
                (P.etatIdPlateau[1][0]==bg.getId() && P.etatIdPlateau[1][1]==bg.getId()) ) && P.etatIdPlateau[1][2]== 0 && !joue) {
            joue = true;
            return  new CoupMorpion(1,2);
        }
        if (( (P.etatIdPlateau[0][0]==bg.getId() && P.etatIdPlateau[1][0]==bg.getId()) ||
                (P.etatIdPlateau[0][2]==bg.getId() && P.etatIdPlateau[1][1]==bg.getId()) ||
                (P.etatIdPlateau[2][1]==bg.getId() && P.etatIdPlateau[2][2]==bg.getId()) ) && P.etatIdPlateau[2][0]== 0 && !joue) {
            joue = true;
            return  new CoupMorpion(2,0);
        }
        if (( (P.etatIdPlateau[2][0]==bg.getId() && P.etatIdPlateau[2][2]==bg.getId()) ||
                (P.etatIdPlateau[0][1]==bg.getId() && P.etatIdPlateau[1][1]==bg.getId()) ) && P.etatIdPlateau[2][1]== 0 && !joue) {
            joue = true;
            return  new CoupMorpion(2,1);
        }
        if (( (P.etatIdPlateau[0][0]==bg.getId() && P.etatIdPlateau[1][1]==bg.getId()) ||
                (P.etatIdPlateau[2][0]==bg.getId() && P.etatIdPlateau[2][1]==bg.getId()) ||
                (P.etatIdPlateau[0][2]==bg.getId() && P.etatIdPlateau[1][2]==bg.getId()) ) && P.etatIdPlateau[2][2]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(2,2);
        }
        
        return new CoupMorpion((int)Math.random(),(int)Math.random());
    }
    
    
    /** Permet au CPU d'empecher l'adversaire de gagner
     *
     * @param bg Un joueur aléatoire
     * @return un coup à jouer par le CPU
     */
    public Coup empecherJFinir(Joueur bg) {
        boolean joue = false;
        int a=0;
        if (bg==J1){
            a=J2.getId();
        }
        if (bg==J2){
            a=J1.getId();
        }
        if (( (P.etatIdPlateau[0][1]==a && P.etatIdPlateau[0][2]==a) ||
                (P.etatIdPlateau[1][0]==a && P.etatIdPlateau[2][0]==a) ||
                (P.etatIdPlateau[1][1]==a && P.etatIdPlateau[2][2]==a) ) && P.etatIdPlateau[0][0]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(0,0);
        }
        if (( (P.etatIdPlateau[0][0]==a && P.etatIdPlateau[0][2]==a) ||
                (P.etatIdPlateau[1][1]==a && P.etatIdPlateau[2][1]==a)) && P.etatIdPlateau[0][1]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(0,1);
        }
        if (( (P.etatIdPlateau[0][0]==a && P.etatIdPlateau[0][1]==a) ||
                (P.etatIdPlateau[2][0]==a && P.etatIdPlateau[1][1]==a) ||
                (P.etatIdPlateau[2][2]==a && P.etatIdPlateau[1][2]==a) ) && P.etatIdPlateau[0][2]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(0,2);
        }
        if (( (P.etatIdPlateau[0][0]==a && P.etatIdPlateau[2][0]==a) ||
                (P.etatIdPlateau[1][1]==a && P.etatIdPlateau[1][2]==a) ) && P.etatIdPlateau[1][0]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(1,0);
        }
        if (( (P.etatIdPlateau[0][0]==a && P.etatIdPlateau[2][2]==a) ||
                (P.etatIdPlateau[0][1]==a && P.etatIdPlateau[2][1]==a) ||
                (P.etatIdPlateau[1][0]==a && P.etatIdPlateau[1][2]==a) ||
                (P.etatIdPlateau[0][2]==a && P.etatIdPlateau[2][0]==a) ) && P.etatIdPlateau[1][1]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(1,1);
        }
        if (( (P.etatIdPlateau[0][2]==a && P.etatIdPlateau[2][2]==a) ||
                (P.etatIdPlateau[1][0]==a && P.etatIdPlateau[1][1]==a) ) && P.etatIdPlateau[1][2]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(1,2);
        }
        if (( (P.etatIdPlateau[0][0]==a && P.etatIdPlateau[1][0]==a) ||
                (P.etatIdPlateau[0][2]==a && P.etatIdPlateau[1][1]==a) ||
                (P.etatIdPlateau[2][1]==a && P.etatIdPlateau[2][2]==a) ) && P.etatIdPlateau[2][0]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(2,0);
        }
        if (( (P.etatIdPlateau[2][0]==a && P.etatIdPlateau[2][2]==a) || (P.etatIdPlateau[0][1]==a && P.etatIdPlateau[1][1]==a) ) && P.etatIdPlateau[2][1]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(2,1);
        }
        if (( (P.etatIdPlateau[0][0]==a && P.etatIdPlateau[1][1]==a) ||
                (P.etatIdPlateau[2][0]==a && P.etatIdPlateau[2][1]==a) ||
                (P.etatIdPlateau[0][2]==a && P.etatIdPlateau[1][2]==a) ) && P.etatIdPlateau[2][2]== 0 && !joue) {
            joue = true;
            return new CoupMorpion(2,2);
        }
        
        return new CoupMorpion((int)Math.random(),(int)Math.random());
    }
}
